﻿using LWH.ByteProtocol;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;


namespace ByteProtocolCSharpDemo
{
    /// <summary>
    /// 一般简单情况下,只需要像下面的例子中设置，协议的数据为一个足够大的缓存
    /// 数组，然后获取属性并调用setData进行数据设置，最后重写协议的getData根
    /// 据实际协议长度从缓存数组中提取出协议数据即可
    /// 
    /// 
    /// 更复杂的情况下，当某个属性非常大，以至于无法确定合适的缓存数组大小，
    /// 这种情况下就比较麻烦，需要对每个属性进行一个缓存包装，这样数据就会
    /// 存在缓存属性中，对PackageProperty要重写getData方法，使其返回的数据是从
    /// 各子属性中提取，因为原getData是从顶层协议中获取数据，而现在是从底层属
    /// 性获取数据，具体可以参考不定长度协议的例子
    /// 
    /// 这种情况下还有一个处理办法是：将不定长度的从属性中移除，然后对不定属性
    /// 和固定属性分别设置数据，最后合并数据
    /// </summary>
    class SimpleProtocolBuilder:SimpleProtocol
    {
        public SimpleProtocolBuilder()
        {
            mData = new byte[16];
        }

        public override byte[] getData()
        {
            int value = getByteLength(mLengthProperty, mSumProperty);

            ByteConverter.putValue((short)value, mData, mLengthProperty.getOffset());

            return ByteConverter.copyOfRange(mData, 0, getLength());
        }

        public SimpleProtocol getProtocol()
        {
            return new SimpleProtocol(getData());
        }

    }
}
